package com.woldier.algorithm.hashing;

import java.util.HashMap;
import java.util.Map;

/**
 * description
 * <p>
 * 给定一个字符串 s ，找到 它的第一个不重复的字符，并返回它的索引 。如果不存在，则返回 -1 。
 * <p>
 * <p>
 * <p>
 * 示例 1：
 * <p>
 * 输入: s = "leetcode"
 * 输出: 0
 * 示例 2:
 * <p>
 * 输入: s = "loveleetcode"
 * 输出: 2
 * 示例 3:
 * <p>
 * 输入: s = "aabb"
 * 输出: -1
 *
 * @author: woldier wong
 * @date: 2023/12/26$ 16:35$
 */
public class Leetcode_387_firstUniqChar {
    /**
     * description
     * <p>
     * 算法思想:
     * <p>
     * 用一个字符计数表记录次数, 用一个map 记录字符第一次出现的位置.
     * <p>
     * 遍历字符串, 将字符数组计数加一, 尝试将对应的索引位置存在map中,如果索引存在, 那么就不再放入map
     * <p>
     * 遍历字符计数数组, 找出频次为1的字符, 然后通过map找出他的索引, 记录索引最小的.
     *
     * @param s
     * @return int
     * @author: woldier wong
     * @date: 2023/12/26 16:36
     */
    public int firstUniqChar(String s) {
        int[] count = new int[26];
        Map<Character, Integer> map = new HashMap<>();

        for (int i = 0; i < s.length(); i++) {
            char c = s.charAt(i); //得到对应的字符
            int index = (int) c - (int) 'a'; //得到对应的索引
            count[index] += 1; //对应索引加1
            int finalI = i;
            map.computeIfAbsent(c, (k) -> finalI); //放入map
        }
        int res = s.length();
        for (int i = 0; i < count.length; i++) {
            if(count[i]!=1) continue; // 如果出现的次数不是1
            char c = (char)(i + 'a');
            int idx = map.get(c); //得到索引
            res = Math.min(idx, res);
        }
        return res==s.length()?s.length():res;
    }
}
